import java.awt.Point;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MFU extends Strategy {

	HashMap<Integer, Integer> memoria;
	List<Point> contadorAcessos;

	public MFU(int numFrames, List<Request> operacoes) {
		super(numFrames, operacoes);
		memoria = new HashMap<Integer, Integer>();
		contadorAcessos = new ArrayList<Point>();
	}

	public void run() {
		for (Request op : requests) {
			if (memoria.containsKey(op.value)) {
				for (Point p : contadorAcessos) {
					if (p.x == op.value) {
						p.y++;
						break;
					}
				}

				hit++;

			} else {
				if (memoria.size() >= frameSize) {
					int maisUsada = -1;
					int removed = -1;
					int pos = -1;
					for (int i = 0; i < contadorAcessos.size(); i++) {

						if (contadorAcessos.get(i).y > maisUsada) {
							maisUsada = contadorAcessos.get(i).y;
							removed = contadorAcessos.get(i).x;
							pos = i;

						}

					}
					memoria.remove(removed);
					contadorAcessos.remove(pos);

				}
				memoria.put(op.value, op.value);
				contadorAcessos.add(new Point(op.value, 0));

			}
		}

	}

	static String getName() {
		return "MFU";
	}

	public void reset() {
		memoria.clear();
		contadorAcessos.clear();
		hit = 0;
	}
}
